home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / ivl / src / ivl_ctrl.c < prev    next >
Text File  |  2000-06-23  |  6KB  |  245 lines

  1. /*
  2. #define DEBUG
  3. *    ivl
  4. *
  5. *    ユーザ操作受け付け処理関連
  6. *
  7. *    from Jun.26,1999    by dummy.x.(with J-SAGA INDUSTRY)
  8. */
  9. #include    <sys\iocs.h>
  10. #include    "comtype.h"
  11. #include    "easymac.h"
  12. #include    "ivl.h"
  13.  
  14. /* 定数定義 */
  15.     /* マウスボール移動判定量
  16.     *    「最低これだけ動かないと認識しない」値
  17.     *    これらはコンパイルオプションで値を変更することもできる
  18.     *    ちなみに、横=16/縦=12 というのは IV.X での値
  19.     */
  20. #if    !defined(MS_MOVE_MIN_X)
  21.  #define    MS_MOVE_MIN_X    16    /* 横方向 */
  22. #endif
  23. #if    !defined(MS_MOVE_MIN_Y)
  24.  #define    MS_MOVE_MIN_Y    12    /* 縦方向 */
  25. #endif
  26.     /* ジョイスティック入力関連 */
  27.         /* bit情報 */
  28. #define    JOY_STK_UP    (1 << 0)    /* スティック上 */
  29. #define    JOY_STK_DW    (1 << 1)    /* スティック下 */
  30. #define    JOY_STK_LF    (1 << 2)    /* スティック左 */
  31. #define    JOY_STK_RG    (1 << 3)    /* スティック右 */
  32. #define    JOY_STK_ALL    (JOY_STK_UP | JOY_STK_DW | JOY_STK_LF | JOY_STK_RG)
  33.                     /* スティック各方向 */
  34. #define    JOY_BTN_A    (1 << 5)    /* トリガA */
  35. #define    JOY_BTN_B    (1 << 6)    /* トリガB */
  36. #define    JOY_BTN_AB    (JOY_BTN_A | JOY_BTN_B)    /* 通常トリガ全部 */
  37. #define    JOY_BTN_SEL    (JOY_STK_UP | JOY_STK_DW)    /* TOWNS:SELECT */
  38. #define    JOY_BTN_RUN    (JOY_STK_LF | JOY_STK_RG)    /* TOWNS:RUN */
  39.  
  40.  
  41. /* キーボード入力を眺める
  42. *    返値:    操作コード(CTRL_~)
  43. */
  44. static
  45. int control_by_key(void)
  46. {
  47.     int result = CTRL_NONE;
  48.     uchar keycode;
  49.  
  50.     /* とりあえず何かキーが押されてるか見る */
  51.     if (_iocs_b_keysns() == 0) {    /* 押されてなければ */
  52.         return result;        /* さっさと返る */
  53.     }
  54.  
  55.     /* 押されてたキーのキーコードを取得 */
  56.     keycode = _iocs_b_keyinp() >> 8;
  57.  
  58.     /* その値で分岐 */
  59.     switch (keycode) {
  60.     case 0x01:    /* [ESC] */
  61.         result = CTRL_QUIT;
  62.         break;
  63.     case 0x11:    /* [Q] */
  64.         result = CTRL_QUIT_KPSCR;
  65.         break;
  66.     case 0x55:    /* [XF1] */
  67.     case 0x38:    /* [ROLL UP] */
  68.     case 0x1d:    /* [Return] */
  69.         result = CTRL_NEXTPAGE;
  70.         break;
  71.     case 0x3e:    /* [↓] */
  72.     case 0x35:    /* [Space] */
  73.         result = CTRL_NEXTLINE;
  74.         break;
  75.     case 0x3c:    /* [↑] */
  76.         result = CTRL_BACKLINE;
  77.         break;
  78.     case 0x56:    /* [XF2] */
  79.     case 0x39:    /* [ROLL DOWN] */
  80.     case 0x0f:    /* [BS] */
  81.         result = CTRL_BACKPAGE;
  82.         break;
  83.     case 0x36:    /* [HOME] */
  84.         result = CTRL_FIRSTPAGE;
  85.         break;
  86.     case 0x3b:    /* [←] */
  87.         result = CTRL_WIDTH_512;
  88.         break;
  89.     case 0x3d:    /* [→] */
  90.         result = CTRL_WIDTH_768;
  91.         break;
  92. #if    0
  93.     case 0x18:    /* [I] */
  94.         result = CTRL_INFO_CHG;
  95.         break;
  96. #endif
  97.     case 0x19:    /* [O] */
  98.         result = CTRL_INFO_NAME;
  99.         break;
  100.     case 0x1a:    /* [P] */
  101.         result = CTRL_INFO_PATH;
  102.         break;
  103.     case 0x1b:    /* [@] */
  104.         result = CTRL_INFO_INFO;
  105.         break;
  106.     case 0x30:    /* [M] */
  107.         result = CTRL_DISP_MONO;
  108.         break;
  109.     case 0x2f:    /* [N] */
  110.         result = CTRL_DISP_NGTV;
  111.         break;
  112.     case 0x2e:    /* [B] */
  113.         result = CTRL_DISP_NORM;
  114.         break;
  115.     default:
  116.         /* 既に「何もしない」の返値が収まってるので何もしない */
  117.         break;
  118.     }
  119.  
  120.     return result;
  121. }
  122.  
  123. /* マウス入力を眺める
  124. *    返値:    操作コード(CTRL_~)
  125. */
  126. static
  127. int control_by_mouse(void)
  128. {
  129.     int result = CTRL_NONE;
  130.     static ushort oldsts;
  131.     schar xmov, ymov;
  132.     ushort eorsts;
  133.     long cursts;
  134.  
  135.     /* 現時点でのマウスボタン状況を取得 */
  136.     cursts = _iocs_ms_getdt();
  137.     eorsts = (ushort)cursts ^ oldsts;    /* .b=!0:ボタン状態に変化があった */
  138.  
  139.     /* マウスボタン処理 */
  140.     if (eorsts) {    /* ボタンの入力状況に変化があった */
  141.         ushort tmp = eorsts & oldsts;    /* .b=!0:前回押されてて今回離された */
  142.         if ((ushort)cursts == 0xffff) {        /* L+R */
  143.             result = CTRL_QUIT;
  144.         } else if ((short)tmp < 0) {        /* L */
  145.             result = CTRL_NEXTPAGE;
  146.         } else if ((char)tmp < 0) {        /* R */
  147.             result = CTRL_BACKPAGE;
  148.         }
  149.     } else {    /* ボタンが押されてなければ */
  150.         /* マウスボール処理 */
  151.         xmov = hie_byte_l(cursts);    /* bit31-24:X移動量 */
  152.         if (xmov < -MS_MOVE_MIN_X) {        /* ← */
  153.             result = CTRL_WIDTH_512;
  154.         } else if (xmov > +MS_MOVE_MIN_X) {    /* → */
  155.             result = CTRL_WIDTH_768;
  156.         } else {
  157.             ymov = hi_byte_l(cursts);    /* bit23-16:Y移動量 */
  158.             if (ymov < -MS_MOVE_MIN_Y) {        /* ↑ */
  159.                 result = CTRL_BACKLINE;
  160.             } else if (ymov > +MS_MOVE_MIN_Y) {    /* ↓ */
  161.                 result = CTRL_NEXTLINE;
  162.             }
  163.         }
  164.     }
  165.  
  166.     /* 今回のボタン状況を次回の「前状況」として保持 */
  167.     oldsts = (ushort)cursts;
  168.  
  169.     return result;
  170. }
  171.  
  172. /* ジョイスティック入力を眺める
  173. *    返値:    操作コード(CTRL_~)
  174. */
  175. static
  176. int control_by_joystick(void)
  177. {
  178.     int result = CTRL_NONE;
  179.     static uchar oldstk;
  180.     uchar curstk, eorstk, curtrg;
  181.  
  182.     /* 現時点でのマウスボタン状況を取得 */
  183.     curstk = ~_iocs_joyget(0);    /* bit=1:入力されている */
  184.     eorstk = curstk ^ oldstk;    /* bit=1:入力状態が変化した */
  185.     curtrg = (curstk ^ oldstk) & curstk;    /* bit=1:今回押された */
  186.  
  187.     /* 操作に応じて処理 */
  188.     if (eorstk & JOY_BTN_AB) {    /* ボタン */
  189.         uchar tmp = eorstk & oldstk;    /* 今回離された */
  190.         if ((curstk & JOY_BTN_AB) == JOY_BTN_AB) {    /* A+B */
  191.             result = CTRL_QUIT;
  192.         } else if (tmp & JOY_BTN_A) {        /* A */
  193.             result = CTRL_NEXTPAGE;
  194.         } else if (tmp & JOY_BTN_B) {        /* B */
  195.             result = CTRL_BACKPAGE;
  196.         }
  197.     } else if (curtrg & JOY_STK_UP) {    /* ↑ */
  198.         result = CTRL_BACKLINE;
  199.  
  200.     } else if (curtrg & JOY_STK_DW) {    /* ↓ */
  201.         result = CTRL_NEXTLINE;
  202.  
  203.     } else if (curtrg & JOY_STK_LF) {    /* ← */
  204.         result = CTRL_WIDTH_512;
  205.  
  206.     } else if (curtrg & JOY_STK_RG) {    /* → */
  207.         result = CTRL_WIDTH_768;
  208.     }
  209.  
  210.     /* 今回のボタン状況を次回の「前状況」として保持 */
  211.     oldstk = curstk;
  212.  
  213.     return result;
  214. }
  215.  
  216. /* ユーザ操作を眺める
  217. *    返値:    操作コード(CTRL_~)
  218. *    注記    * 操作デバイスの受け付け優先順位は、
  219. *            キーボード→マウス→ジョイスティック
  220. *        となっている。
  221. */
  222. int get_user_ctrl(void)
  223. {
  224.     int result = CTRL_NONE;
  225.  
  226.     /* キーボードを見る */
  227.     if (!chkbit(state_flag_bits, FBIT_NOCTRL_KEY)) {
  228.         result = control_by_key();
  229.     }
  230.     /* マウスを見る */
  231.     if (result == CTRL_NONE) {    /* まだ有効な操作がなかったら */
  232.         if (!chkbit(state_flag_bits, FBIT_NOCTRL_MS)) {
  233.             result = control_by_mouse();
  234.         }
  235.     }
  236.     /* ジョイスティックを見る */
  237.     if (result == CTRL_NONE) {    /* まだ有効な操作がなかったら */
  238.         if (!chkbit(state_flag_bits, FBIT_NOCTRL_JOY)) {
  239.             result = control_by_joystick();
  240.         }
  241.     }
  242.     return result;
  243. }
  244.  
  245.